package org.controller.process;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java dao controller
// Archivo : CommandExecuteSQL.java
// Descripcion : Clase CommandExecuteSQL
// *************************************************************************/
// Version : 1.0.5
// Fecha de Creación: 03 de Julio de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.Connection;
import java.sql.SQLException;
import org.controller.interfaces.ControllerCommandSQL;
import org.sql.commands.exception.DMLException;
import org.sql.connector.ServerManager;
import org.tools.Result;

public class CommandExecuteSQL {

    // Metodos de la clase CommandExecuteSQL
    
    /**
     * Este método nos permite ejecutar un Proceso de Tipo SQL.
     *
     * @param server Objeto para configurar Conexión con Servidor
     * @param controller Objeto que contiene la Configuración del Proceso
     * @return Retorna el resultado en un objeto <code>Result</code>.
     */
    public static Result execute(ServerManager server, ControllerCommandSQL controller) {
        // Declarando y configurando objeto de Respuesta
        Result result = controller.validate();

        if (!result.isSuccess()) {
            return result;
        } // Proceso de Validación de Datos Incorrecto

        // Reconfigura el objeto de Respuesta para ser Procesado
        result = controller.configurateData();

        // Realizamos la conexion con el Servidor
        server.connect();

        if (server.isConnect()) {
            Connection connection = server.getConnection();

            try {
                result = controller.process(connection);
            } // Ejecutando proceso establecido
            
            catch (SQLException ex) {
                result = controller.processSQLException(ex);
            } // Se generó un Error de tipo SQL en el Proceso
            
            catch (DMLException ex) {
                result.setMessage(ex.getMessage());
            } // Se generó un Error de Especificación de Comando
            
            finally {
                try {
                    connection.close();
                } // Conexión cerrada
                
                catch (SQLException ex) {
                    System.out.println(ex.getErrorCode() + ": " + ex.getMessage());
                }
            } // Cerrando el flujo de Conexión con el Servidor
        } // Se ha establecido Conexión con el Servidor
        
        else {
            result.setMessage("No se pudo conectar con el Servidor de Base de Datos");
        } // No se realizó conexion con el Servidor

        return result; // Retornando resultado
    }
}